package org.dromara.monitor.admin.notifier;

import de.codecentric.boot.admin.server.domain.entities.Instance;
import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;
import de.codecentric.boot.admin.server.domain.events.InstanceEvent;
import de.codecentric.boot.admin.server.domain.events.InstanceStatusChangedEvent;
import de.codecentric.boot.admin.server.notify.AbstractEventNotifier;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：自定义事件通知处理
 */
/**
 * CustomNotifier 类继承自 AbstractEventNotifier，用于实现自定义的通知机制。
 * 这个类提供了额外的通知功能，以满足特定业务场景的需求。
 */
@Slf4j
@Component
public class CustomNotifier extends AbstractEventNotifier {


    /**
     * 构造函数，初始化CustomNotifier对象
     *
     * @param repository 实例仓库对象，用于后续的通知操作
     */
    protected CustomNotifier(InstanceRepository repository) {
        super(repository);
    }

    /**
     * 处理实例通知的实现方法
     *
     * @param event 实例事件对象，描述了发生的事件
     * @param instance 相关的实例对象
     * @return 返回一个Mono<Void>流式对象，用于异步处理通知
     *
     * 该方法通过Mono.fromRunnable将Runnable转化为Mono对象，实现了异步处理实例事件的功能
     * 当事件类型为实例状态改变（InstanceStatusChangedEvent）时，记录实例状态改变的日志信息
     */
    @Override
    @SuppressWarnings("all")
    protected Mono<Void> doNotify(InstanceEvent event, Instance instance) {
        return Mono.fromRunnable(() -> {
            // 实例状态改变事件
            if (event instanceof InstanceStatusChangedEvent) {
                String registName = instance.getRegistration().getName();
                String instanceId = event.getInstance().getValue();
                String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus();
                log.info("Instance Status Change: [{}],[{}],[{}]", registName, instanceId, status);
            }

        });
    }

}
